在Scala裡,多重繼承是不被允許的,所以要實現多重繼承的概念時就可以用特徵(trait),因為它可以被繼承多個。
特徵就類似Java的介面(interface),不過它的功能更為強大
用法是使用關鍵字trait
,子類別在繼承時使用extends
如果要繼承多個特徵時就用逗號(commas)隔開。
trait hasFourLeg:
def run(): Unit
trait hasTeeth:
def bite(): Unit
class Dog extends hasFourLeg, hasTeeth:
def run(): Unit = println("run!")
def bite(): Unit = println("bite!!")
如果要繼承多個特徵時就用逗號(commas)隔開。
接著我們來看特徵定義抽象方法
trait Pet:
def speak() = println("bark!")
def hasFur(): Unit //abstract method
class goldenRetriever extends Pet:
def hasFur() = println("I have golden fur!!")
class whiteCat extends Pet:
override def speak() = println("meow~")
def hasFur() = println("I have white fur.")
另外,當一個類別extends一個特徵卻沒有實作它的抽象方法時,這個類別必須被宣告為抽象類別。
abstract class bird extends Pet:
def fly(): Unit = println("fly!")
儘管Scala有提供抽象類別,一般還是比較常用特徵。
因為一個子類別只能extends一個抽象類別,但卻可以實作很多特徵,所以使用特徵還是比較有彈性。